import uiautomation
import win32gui
import win32con
import ctypes,re

def send_click(hwnd, x, y, button='left', click_type='single'):
    """
    向指定窗口的指定坐标发送鼠标点击消息
    :param hwnd: 目标窗口的句柄
    :param x: 点击位置的 x 坐标
    :param y: 点击位置的 y 坐标
    :param button: 点击的鼠标按键，可选值为 'left' 或 'right'，默认为 'left'
    :param click_type: 点击类型，可选值为 'single' 或 'double'，默认为 'single'
    :return: 若点击模拟成功返回 True，否则返回 False
    """
    try:
        if hwnd == 0:
            print("无效的窗口句柄。")
            return False

        # 将坐标转换为 Windows 消息所需的格式
        lParam = y << 16 | x

        if button == 'left':
            if click_type == 'single':
                # 发送鼠标左键按下消息
                win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
                # 发送鼠标左键释放消息
                win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, lParam)
            elif click_type == 'double':
                # 发送鼠标左键按下消息
                win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
                # 发送鼠标左键释放消息
                win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, lParam)
                # 发送鼠标左键双击消息
                win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDBLCLK, win32con.MK_LBUTTON, lParam)
        elif button == 'right':
            if click_type == 'single':
                # 发送鼠标右键按下消息
                win32gui.SendMessage(hwnd, win32con.WM_RBUTTONDOWN, win32con.MK_RBUTTON, lParam)
                # 发送鼠标右键释放消息
                win32gui.SendMessage(hwnd, win32con.WM_RBUTTONUP, 0, lParam)
            elif click_type == 'double':
                # 发送鼠标右键按下消息
                win32gui.SendMessage(hwnd, win32con.WM_RBUTTONDOWN, win32con.MK_RBUTTON, lParam)
                # 发送鼠标右键释放消息
                win32gui.SendMessage(hwnd, win32con.WM_RBUTTONUP, 0, lParam)
                # 发送鼠标右键双击消息
                win32gui.SendMessage(hwnd, win32con.WM_RBUTTONDBLCLK, win32con.MK_RBUTTON, lParam)

        return True
    except Exception as e:
        print(f"发送点击消息时出错: {e}")
        return False


def post_click(hwnd, x, y, button='left', click_type='single'):
    """
    向指定窗口的指定坐标发送异步鼠标点击消息
    :param hwnd: 目标窗口的句柄
    :param x: 点击位置的 x 坐标
    :param y: 点击位置的 y 坐标
    :param button: 点击的鼠标按键，可选值为 'left' 或 'right'，默认为 'left'
    :param click_type: 点击类型，可选值为 'single' 或 'double'，默认为 'single'
    :return: 若消息发送成功返回 True，否则返回 False
    """
    try:
        if hwnd == 0:
            print("无效的窗口句柄。")
            return False

        # 将坐标转换为 Windows 消息所需的格式
        lParam = y << 16 | x

        if button == 'left':
            if click_type == 'single':
                # 发送鼠标左键按下消息
                win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
                # 发送鼠标左键释放消息
                win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, 0, lParam)
            elif click_type == 'double':
                # 发送鼠标左键按下消息
                win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
                # 发送鼠标左键释放消息
                win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, 0, lParam)
                # 发送鼠标左键双击消息
                win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDBLCLK, win32con.MK_LBUTTON, lParam)
        elif button == 'right':
            if click_type == 'single':
                # 发送鼠标右键按下消息
                win32gui.PostMessage(hwnd, win32con.WM_RBUTTONDOWN, win32con.MK_RBUTTON, lParam)
                # 发送鼠标右键释放消息
                win32gui.PostMessage(hwnd, win32con.WM_RBUTTONUP, 0, lParam)
            elif click_type == 'double':
                # 发送鼠标右键按下消息
                win32gui.PostMessage(hwnd, win32con.WM_RBUTTONDOWN, win32con.MK_RBUTTON, lParam)
                # 发送鼠标右键释放消息
                win32gui.PostMessage(hwnd, win32con.WM_RBUTTONUP, 0, lParam)
                # 发送鼠标右键双击消息
                win32gui.PostMessage(hwnd, win32con.WM_RBUTTONDBLCLK, win32con.MK_RBUTTON, lParam)

        return True
    except Exception as e:
        print(f"发送点击消息时出错: {e}")
        return False

def GetControl_Center(Control:uiautomation.Control):
    _center_x = int(Control.BoundingRectangle.left + Control.BoundingRectangle.width() / 2)
    _center_y = int(Control.BoundingRectangle.top + Control.BoundingRectangle.height() / 2)    
    return _center_x,_center_y


def Goto_Desktop():
    root = uiautomation.GetRootControl()
    _handle = root.WindowControl(Name='打开').PaneControl(Name='浏览器窗格').PaneControl(Name='文件夹布局窗格').PaneControl(Name='控制项宿主').TreeControl(Name='树视图').NativeWindowHandle
    _control = root.WindowControl(Name='打开').PaneControl(Name='浏览器窗格').PaneControl(Name='文件夹布局窗格').PaneControl(Name='控制项宿主').TreeControl(Name='树视图').TreeItemControl(Name='桌面').TreeItemControl(Name='此电脑').TreeItemControl(Name='桌面')
    _center_x,_center_y = GetControl_Center(Control=_control)
    post_click(_handle,_center_x,_center_y,'left')    


def GetCurrent_Dialog_Path() -> str:
    root = uiautomation.GetRootControl()
    _control = root.WindowControl(Name='打开').ProgressBarControl(Name='').ToolBarControl(RegexName='^地址')
    path = re.search(pattern=r"^地址:.*?(\w.*)",string=_control.Name).group(1)
    return path
    

if GetCurrent_Dialog_Path().find("桌面") == -1:
    Goto_Desktop()